package com.cyx.common.message.service;

import com.alibaba.fastjson2.JSON;
import com.netease.nim.server.sdk.core.Result;
import com.netease.nim.server.sdk.core.YunxinApiHttpClient;
import com.netease.nim.server.sdk.sms.ISmsApiService;
import com.netease.nim.server.sdk.sms.YunxinSmsApiServices;
import com.netease.nim.server.sdk.sms.request.SmsSendCodeRequest;
import com.netease.nim.server.sdk.sms.response.SmsSendCodeResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
@Slf4j
public class NetEaseSmsService {

    @Autowired
    private YunxinApiHttpClient yunxinApiHttpClient; // 短信服务client

    //业务配置
    @Value("${sms.netease.templateId:}")
    private String templateId; // 短信模版的id

    @Value("${sms.netease.signName:}")
    private String signName; // 短信签名内容

    /**
     * 发送短信验证码
     *
     * @param phone
     * @param code
     */
    public boolean sendMobileCode(String phone, String code) {
        // map把验证码和code对应存储起来
        Map<String, String> params = new HashMap<>();
        params.put("code", code);
        // 调用发送短信方法
        return sendTempMessage(phone, signName, templateId, params);
    }

    /**
     * 发送模板短信
     *
     * @param phone
     * @param singName
     * @param templateCode
     * @param params
     */
    public boolean sendTempMessage(String phone, String singName, String templateCode, Map<String, String> params) {
        // 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
        SmsSendCodeRequest smsSendCodeRequest = new SmsSendCodeRequest();
        // 设置下发手机号码  就是给谁发短信
        smsSendCodeRequest.setMobile(phone);
        YunxinSmsApiServices services = new YunxinSmsApiServices(yunxinApiHttpClient);
        ISmsApiService smsApiService = services.getSmsApiService();
        try {
            // 通过 client 对象调用 SendSms 方法发起请求，返回的 res 是一个 SendSmsResponse 类的实例
            Result<SmsSendCodeResponse> result = smsApiService.sendCode(smsSendCodeRequest);
            // 获取短信请求错误码和错误信息
            if (result.getCode() != 200) {
                log.error("短信{} 发送失败，失败原因:{}.... ", JSON.toJSONString(smsSendCodeRequest), result.getMsg());
                return false;
            }
            return true;
        }  catch (Exception e) {
            log.error("短信{} 发送失败，失败原因:{}.... ",  JSON.toJSONString(smsSendCodeRequest), e.getMessage());
            return false;
        }
    }
}
